lexer grammar AnalexC;

options {
  language = Java;
}

tokens {

}
 
@lexer::header {
  package Practica4.EBNF;
}

@lexer::members {
  private ArrayList<String> errors = new ArrayList<String>();
    public void displayRecognitionError(String[] tokenNames,
                                        RecognitionException e) {
        String hdr = getErrorHeader(e);
        String msg = getErrorMessage(e, tokenNames);
        errors.add(hdr + " " + msg);
    }
    
    public ArrayList<String> getErrors() {
        return errors;
    }
}

fragment SALTO_LINEA:  ('\r' '\n' | '\r' | '\n');
fragment DIGITO: '0'..'9';
fragment LETRA: 'A'..'Z' | 'a'..'z' | '_';

KEYWORD_VOID
  : 'void'
  ;
  
KEYWORD_INT
  : 'int'
  ;

KEYWORD_WHILE
  : 'while'
  ;
  
KEYWORD_IF
  : 'if'
  ;
  
COMENTARIO_LINEA : '//' (options { greedy=false;}:.)* SALTO_LINEA {skip();};
COMENTARIO_BLOQUE: '/*' ('*' ~('/') | ~ ('*'))* '*/' {skip();};
BLANCO: (' ' | '\t' | SALTO_LINEA) {skip();};
NUMERO : (DIGITO)+('.'(DIGITO)+)?;
ID: LETRA (LETRA | DIGITO)*;
STRING: '\"' (options { greedy=false; }:.)* '\"';

OP_ASSIGN: '=';
OP_SUM: '+';
OP_SUB: '-';
OP_DIV: '/';
OP_MULT: '*';
OP_INC: '++';
OP_DEC: '--';
OP_MAI: '>=';
OP_MA: '>';
OP_MAE: '<=';
OP_ME: '<';
AMPERSAND: '&';
PARENTESIS: '(' | ')';
LLAVES: '{' | '}';
CORCHETES: '[' | ']';
COMA: ',';
SEPARADOR: ';';
